#pragma once

#include <iostream>
#include <string>
#include <cstdio>

#include <sys/types.h>
#include <unistd.h>
#include <signal.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "localcommon.hpp"

// daemon 守护进程

void Daemon(int nochdir, int noclose)
{
    // 1.设置信号
    signal(SIGPIPE, SIG_IGN);
    signal(SIGCHLD, SIG_IGN);

    // 2.创建子进程,结束父进程，获得孤儿进程
    if (fork() > 0)
        exit(0);

    // 3.成为一个独立会话
    setsid();

    // 4.更改工作路径 部署服务器时使用
    if (nochdir == 0)
        chdir("/");

    // 5.关闭stdin stdout stderr
    // 打开 dev/null 将012重定向
    if (noclose == 0)
    {
        int lo_fd = ::open("/dev/null", O_RDWR);
        if (lo_fd < 0)
        {
            Local_Log::LOG(Local_Log::LogLever::LINFO) << "open error";
            exit(ERR_OPEN);
        }
        else
        {
            dup2(lo_fd, 0);
            dup2(lo_fd, 1);
            dup2(lo_fd, 2);
            close(lo_fd);
        }
    }
}

// setsid
// daemon
// dup2
// chdir